package com.rabbitmq.topicdemo.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TopicConfig {

    public static final String TOPIC_QUEUE="topic_queue";
    public static final String TOPIC_EXCHANGE="topic_exchange";

    /**
     * 类似direct但是可以是多级路由key类似： app.order.pay  app的订单业务中的支付业务
     *
     * 也可以进行模糊匹配，比如订单业务的支付，多款app公用一个发送短信的消费者 ， 不同app的路由key不同但最终需要使用的消费者一致，
     * 那就可以让生产者准备好不同app各自的消息，然后通过路由key模糊匹配到同一个消费者 ， 通过该消费者将各个app的消息发送出去
     *
     * rabbitmq的主题模式提供了路由key模糊匹配的功能 ， 例如匹配上面两个路由key ， 有两个模糊匹配的符号 ： # 和 *
     * #可以匹配0或多级路径
     * *仅可以匹配一级 ， 且最少一级路径
     * eg:
     * 匹配 app.order.pay和app.order.insert
     * #.pay  ， #.order.pay  ， #.app.order.pay  都可以匹配到app.order.pay
     * *.order.pay 可以匹配到app.order.pay ， 但是 *.app.order.pay 和 *.app.order.pay 不能匹配到app.order.pay
     */
    public static final String PAY_ROUTE_RULE="*.order.pay";
    public static final String INSERT_ROUTE_RULE="#.order.insert";
    public static final String MSG_ROUTE_RULE="#.msg";

    /**
     * 创建队列
     */
    @Bean
    public Queue queue01(){
        return new Queue(TOPIC_QUEUE+"_pay",false,false,true);
    }
    @Bean
    public Queue queue02(){
        return QueueBuilder.nonDurable(TOPIC_QUEUE+"_insert").autoDelete().build();
    }
    @Bean
    public Queue queue03(){
        return QueueBuilder.nonDurable(TOPIC_QUEUE+"_msg").autoDelete().build();
    }

    /**
     * 创建的交换机
     */
    @Bean
    public TopicExchange topicExchange(){
        //同理队列，建造者模式也可以在后面加很多属性
        return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE).autoDelete().build();
    }

    /**
     * 绑定关系
     */

    //pay
    @Bean
    public Binding topic01(){
        return BindingBuilder.bind(queue01()).to(topicExchange()).with(PAY_ROUTE_RULE);
    }
    //inset
    @Bean
    public Binding topic02(){
        return BindingBuilder.bind(queue02()).to(topicExchange()).with(INSERT_ROUTE_RULE);
    }
    //MSG
    @Bean
    public Binding topic03(){
        return BindingBuilder.bind(queue03()).to(topicExchange()).with(MSG_ROUTE_RULE);
    }
}
